/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年10月7日
 * 项目： rainhy-webcore
 */
package com.rainhy.property.context;

import org.springframework.beans.factory.InitializingBean;

/**
 * 属性容器
 * 
 * @author rain
 * @version [版本号, 2016年10月7日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class PropertyContext extends PropertyContextBuilder implements InitializingBean {
    /** 自身唯一引用 */
    private static PropertyContext context;
    
    /**
     * 
     * 根据属性 key 获取属性
     *
     * @param property
     * 
     * @return T 属性
     * @throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     * @version [版本号, 2016年10月7日]
     * @author rain
     */
    @SuppressWarnings("unchecked")
    public static <T> T get(PropertyKey property) {
        return (T) getContext().getProperty(property.propertyType(), property.propertyKey());
    }
    
    /**
     * 
     * 根据属性 key 和属性 type 获取属性
     *
     * @param propertytype 属性 type
     * @param propertyKey 属性 key
     * 
     * @return T 属性
     * @throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     * @version [版本号, 2016年10月7日]
     * @author rain
     */
    @SuppressWarnings("unchecked")
    public static <T> T get(String propertyType, String propertyKey) {
        return (T) getContext().getProperty(propertyType, propertyKey);
    }
    
    /** 返回自身唯一引用 */
    public static PropertyContext getContext() {
        return PropertyContext.context;
    }
    
    /**
     * 删除属性
     *
     * @param propertyType 属性类型
     * @param propertyKey 属性key
     * 
     * @return void [返回类型说明]
     * @throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     * @version [版本号, 2016年10月14日]
     * @author rain
     */
    public static void remove(String propertyType, String propertyKey) {
        getContext().removeProperty(propertyType, propertyKey);
    }
    
    /**
     * 
     * 设置属性
     *
     * @param propertytype 属性 type
     * @param propertyKey 属性 key
     * @param property 属性
     * 
     * @return void [返回类型说明]
     * @throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     * @version [版本号, 2016年10月10日]
     * @author rain
     */
    public static void set(PropertyKey propertyKey, Object property) {
        getContext().setProperty(propertyKey.propertyType(), propertyKey.propertyKey(), property);
    }
    
    /**
     * 
     * 设置属性
     *
     * @param propertytype 属性 type
     * @param propertyKey 属性 key
     * @param property 属性
     * 
     * @return void [返回类型说明]
     * @throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     * @version [版本号, 2016年10月10日]
     * @author rain
     */
    public static void set(String propertyType, String propertyKey, Object property) {
        getContext().setProperty(propertyType, propertyKey, property);
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        PropertyContext.context = this;
        super.afterPropertiesSet();
        
        logger.debug("[属性容器]启动完成...");
    }
    
    /**
     * 
     * 获取属性
     *
     * @param propertyType 属性类型
     * @param propertyKey 属性key
     * 
     * @return Object [返回类型说明]
     * @throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     * @version [版本号, 2016年10月15日]
     * @author rain
     */
    public Object getProperty(String propertyType, String propertyKey) {
        PropertyManager manager = getPropertyManager(propertyType);
        return manager.getProperty(propertyType, propertyKey);
    }
    
    /**
     * 删除属性
     *
     * @param propertyType 属性类型
     * @param propertyKey 属性key
     * 
     * @return void [返回类型说明]
     * @throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     * @version [版本号, 2016年10月14日]
     * @author rain
     */
    public void removeProperty(String propertyType, String propertyKey) {
        PropertyManager manager = getPropertyManager(propertyType);
        manager.removeProperty(propertyType, propertyKey);
    }
    
    /**
     * 
     * 保存属性
     *
     * @param propertyType 属性类型
     * @param propertyKey 属性key
     * @param property 属性
     * 
     * @return void [返回类型说明]
     * @throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     * @version [版本号, 2016年10月10日]
     * @author rain
     * @return
     */
    public void setProperty(String propertyType, String propertyKey, Object property) {
        PropertyManager manager = getPropertyManager(propertyType);
        manager.setProperty(propertyType, propertyKey, property);
    }
}
